#include <iostream>
#include "Identificador.h"
#include "Compilador.h"
#include "Arvore.h"
#include "NoArvore.h"

int main (int argc, char **argv)
{
    Arvore interface;

    NoArvore *pai   = interface.inserirRaiz("[ T R A B A L H O   D E   C O M P I L A D O R ]");
    NoArvore *filho = pai->inserirFilho("[ P R O F E S S O R ]");
    filho->inserirFilho("Alan Salvany Felinto");
    filho = pai->inserirFilho("[ M A T E R I A ]");
    filho->inserirFilho("Compiladores");
    filho = pai->inserirFilho("[ A L U N O S ]");
    filho->inserirFilho("Luiz Gustavo Castilho Martins");
    filho->inserirFilho("Paulo Cesar Ferreira");
    filho = pai->inserirFilho("[ L I N G U A G E M ]");
    filho->inserirFilho("Pascal Simplificado");

    if (argc < 3)
    {
        filho = pai->inserirFilho("[ E R R O ]");
        filho->inserirFilho("Programa chamado incorretamente, tente:");
        filho->inserirFilho("<nome_programa> <arquivo_entrada> <arquivo_saida>");
        interface.exibirArvore(std::cout);
        return 0;
    }

    filho = pai->inserirFilho("[ A R Q U I V O   D E   E N T R A D A ]");
    filho->inserirFilho(argv[1]);
    filho = pai->inserirFilho("[ A R Q U I V O   D E   S A I D A ]");
    filho->inserirFilho(argv[2]);

    NoArvore *arquivos = pai->inserirFilho("[ A R Q U I V O S   D E   D E B U G ]");

    filho = pai->inserirFilho("[ R E L A T O R I O   D E   E X E C U C A O ]");

    bool sucesso;

    Compilador compilador;

    if (sucesso = compilador.executarLexico(argv[1]))
    {
        filho->inserirFilho("Analise Lexica executada com sucesso.");
    }
    else
    {
        filho->inserirFilho("Erro encontrado na execucao da Analise Lexica.");
    }

    compilador.exibirLexico();
    arquivos->inserirFilho("Tokens.txt");

    if (sucesso == true)
    {
        if (sucesso = compilador.executarSintatico())
        {
            filho->inserirFilho("Analise Sintatica executada com sucesso.");
            compilador.exibirArvoreSemantica();
            arquivos->inserirFilho("ArvoreSemantica.txt");
            arquivos->inserirFilho("Hash.txt");
        }
        else
        {
            filho->inserirFilho("Erro encontrado na execucao da Analise Sintatica.");
        }
    }

    if (sucesso == true)
    {
        NoArvore *noErro = filho->inserirFilho("Analise Semantica");

        if (sucesso = compilador.executarSemantico(noErro))
        {
            noErro->setNo(noErro->getNivel(), "Analise Semantica executada com sucesso.");
        }
        else
        {
            noErro->setNo(noErro->getNivel(), "Erro encontrado na execucao da Analise Semantica.");
        }
    }

    if (sucesso == true)
    {
        filho->inserirFilho("Gerado código da MEPA.");
    }
   
    interface.exibirArvore(std::cout);
    
    if (sucesso) compilador.gerarCodigo();

    return 0;
}
